package gui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import bd.ConsultasTableModel;
import bd.Resultado;
import bd.Servicios;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
 * Builder, which is free for non-commercial use. If Jigloo is being used
 * commercially (ie, by a corporation, company or business for any purpose
 * whatever) then you should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details. Use of Jigloo implies
 * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
 * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
 * ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class VentanaPrestamo extends javax.swing.JInternalFrame {
	private JLabel jnombre;
	private JPanel jPanel2;
	private Servicios serv;
	private JScrollPane jScrollPane;
	private JLabel error;
	private JTextField valorCuota;
	private JLabel jValorCuota;
	private JLabel jTasaInt;
	private JLabel jCantMeses;
	private JLabel jLabelMonto;
	private JLabel infoP;
	private JButton aceptar;
	private JPanel pnlAux;
	private JLabel ppC;
	private JLabel dC;
	private JTextField tasaInt;
	private JComboBox meses;
	private JTextField monto;
	private JLabel tC;
	private JLabel fC;
	private JLabel tnC;
	private JLabel naC;
	private JLabel infoC;
	private JPanel jPanel3;
	private JPanel Clientes;
	private JLabel buscar;
	private JTextField nrodoc;
	private JComboBox tipodoc;
	private JTable tabla;
	private int cliente;

	public VentanaPrestamo() {
		super();
		serv = Servicios.getServicios();
		initGUI();
	}

	private void initGUI() {
		try {
			this.setPreferredSize(new java.awt.Dimension(741, 471));
			this.setBounds(0, 0, 741, 471);
			BorderLayout thisLayout = new BorderLayout();
			getContentPane().setLayout(thisLayout);
			this.setVisible(false);
			{
				jPanel2 = new JPanel();
				BorderLayout jPanel2Layout = new BorderLayout();
				getContentPane().add(jPanel2, BorderLayout.NORTH);
				jPanel2.setPreferredSize(new java.awt.Dimension(730, 62));
				jPanel2.setLayout(jPanel2Layout);
				jPanel2.setBounds(0, 0, 730, 62);
				{
					jnombre = new JLabel();
					jPanel2.add(jnombre, BorderLayout.NORTH);
					jnombre.setText("Empleado: ");
					jnombre.setBounds(17, 5, 701, 17);
					jnombre.setHorizontalTextPosition(SwingConstants.CENTER);
					jnombre.setHorizontalAlignment(SwingConstants.CENTER);
					jnombre.setPreferredSize(new java.awt.Dimension(730, 28));
				}
				{
					pnlAux = new JPanel();
					jPanel2.add(pnlAux, BorderLayout.CENTER);
					{
						buscar = new JLabel();
						pnlAux.add(buscar);
						buscar.setText("Buscar Cliente");
						buscar.setBounds(22, 34, 145, 17);
						buscar.setFont(new java.awt.Font("DejaVu Serif", 0, 14));
						buscar.setHorizontalAlignment(SwingConstants.CENTER);
					}
					{
						ComboBoxModel tipoModel = new DefaultComboBoxModel(
								new String[] { "" });
						tipodoc = new JComboBox();
						pnlAux.add(tipodoc);
						tipodoc.setModel(tipoModel);
						tipodoc.setBounds(173, 28, 108, 28);
					}
					{
						nrodoc = new JTextField();
						pnlAux.add(nrodoc);
						nrodoc.setBounds(293, 29, 173, 28);
						nrodoc.setText("Nro Documento");
						nrodoc.setPreferredSize(new java.awt.Dimension(156, 25));
						nrodoc.addFocusListener(new FocusAdapter() {
							public void focusGained(FocusEvent evt) {
								nrodoc.setText("");
							}
						});
						nrodoc.addKeyListener(new KeyAdapter() {
							public void keyReleased(KeyEvent evt) {
								if (nrodoc.getText().equals(""))
									refresh(-1);
								else
									refresh(Integer.parseInt(nrodoc.getText()));
							}
						});
						nrodoc.addKeyListener(new KeyAdapter() {
							public void keyTyped(KeyEvent e) {
								char caracter = e.getKeyChar();

								if (((caracter < '0') || (caracter > '9'))
										&& (caracter != '\b' /*
															 * corresponde a
															 * BACK_SPACE
															 */)) {
									e.consume(); // ignorar el evento de teclado
								}
							}
						});

					}
				}
			}

			{
				Clientes = new JPanel();
				BorderLayout ClientesLayout = new BorderLayout();
				Clientes.setLayout(ClientesLayout);
				getContentPane().add(Clientes, BorderLayout.CENTER);
				Clientes.setBounds(0, 62, 730, 100);
				{
					jScrollPane = new JScrollPane();
					Clientes.add(jScrollPane, BorderLayout.CENTER);
					jScrollPane.setBounds(0, 0, 730, 100);
					{
						TableModel tablaModel = new DefaultTableModel(
								new String[][] { {}, {} }, new String[] {});
						tabla = new JTable();
						jScrollPane.setViewportView(tabla);
						tabla.setAutoCreateRowSorter(true);
						tabla.setModel(tablaModel);
						tabla.addMouseListener(new MouseAdapter() {
							@Override
							public void mouseReleased(MouseEvent arg0) {
								int row = tabla.rowAtPoint(arg0.getPoint());
								Long value = (Long) tabla.getValueAt(row, 0);

								if (value != null) {
									aceptar.setEnabled(false);
									verificarCliente(value.intValue());
								}
							}
						});
					}

				}
			}
			{
				jPanel3 = new JPanel();
				getContentPane().add(jPanel3, BorderLayout.SOUTH);
				jPanel3.setLayout(null);
				jPanel3.setBounds(0, 162, 730, 282);
				jPanel3.setPreferredSize(new java.awt.Dimension(730, 269));
				{
					infoC = new JLabel();
					jPanel3.add(infoC);
					infoC.setText("Información del Cliente");
					infoC.setBounds(12, 12, 345, 17);
				}
				{
					naC = new JLabel();
					jPanel3.add(naC);
					naC.setText("Apellido, Nombre:");
					naC.setBounds(24, 35, 345, 15);
				}
				{
					tnC = new JLabel();
					jPanel3.add(tnC);
					tnC.setText("Tipo, nro documento:");
					tnC.setBounds(24, 56, 345, 15);
				}
				{
					fC = new JLabel();
					jPanel3.add(fC);
					fC.setText("Fecha de nacimiento:");
					fC.setBounds(24, 77, 345, 15);
				}
				{
					dC = new JLabel();
					jPanel3.add(dC);
					dC.setText("Dirección:");
					dC.setBounds(24, 98, 345, 15);
				}
				{
					tC = new JLabel();
					jPanel3.add(tC);
					tC.setText("Teléfono:");
					tC.setBounds(24, 119, 345, 15);
				}
				{
					ppC = new JLabel();
					jPanel3.add(ppC);
					ppC.setText("Puede solicitar un préstamo: ");
					ppC.setBounds(24, 140, 345, 15);
				}
				{
					aceptar = new JButton();
					jPanel3.add(aceptar);
					aceptar.setText("Crear Préstamo");
					aceptar.setBounds(609, 193, 109, 27);
					aceptar.setEnabled(false);
					aceptar.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							aceptarActionPerformed(evt);
						}
					});
				}
				{
					infoP = new JLabel();
					jPanel3.add(infoP);
					infoP.setText("Detalles del nuevo préstamo");
					infoP.setBounds(357, 13, 295, 15);
				}
				{
					jLabelMonto = new JLabel();
					jPanel3.add(jLabelMonto);
					jLabelMonto.setText("Monto:");
					jLabelMonto.setBounds(375, 51, 56, 15);
				}
				{
					jCantMeses = new JLabel();
					jPanel3.add(jCantMeses);
					jCantMeses.setText("Cantidad de meses:");
					jCantMeses.setBounds(375, 83, 121, 15);
				}
				{
					jTasaInt = new JLabel();
					jPanel3.add(jTasaInt);
					jTasaInt.setText("Tasa de interés:");
					jTasaInt.setBounds(375, 119, 98, 15);
				}
				{
					jValorCuota = new JLabel();
					jPanel3.add(jValorCuota);
					jValorCuota.setText("Valor de la cuota:");
					jValorCuota.setBounds(375, 155, 109, 15);
				}
				{
					monto = new JTextField();
					jPanel3.add(monto);
					monto.setBounds(500, 41, 118, 25);
					monto.addKeyListener(new KeyAdapter() {
						public void keyReleased(KeyEvent evt) {
							float m;
							float max = serv.getMaximoMontoPrestamo();
							if (monto.getText().equals("")) {
								tasaInt.setText("");
								valorCuota.setText("");
								aceptar.setEnabled(false);
								error.setVisible(true);
							} else {

								m = Float.parseFloat(monto.getText());

								if (m > max && m > 0) {
									error.setVisible(true);
									aceptar.setEnabled(false);
									tasaInt.setText("");
									valorCuota.setText("");
								} else {
									error.setVisible(false);
									aceptar.setEnabled(true);
									calcularValores();
								}
							}

						}
					});
					monto.addKeyListener(new KeyAdapter() {
						public void keyTyped(KeyEvent e) {
							char caracter = e.getKeyChar();

							if (((caracter < '0') || (caracter > '9'))
									&& (caracter != '\b')) {
								e.consume();
							}
						}
					});
					monto.setEnabled(false);

				}
				{

					ComboBoxModel mesesModel = new DefaultComboBoxModel(
							new String[] { "" });
					meses = new JComboBox();
					jPanel3.add(meses);
					meses.setModel(mesesModel);
					meses.setBounds(500, 78, 118, 25);
					meses.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							if (aceptar.isEnabled())
								calcularValores();
						}
					});
					meses.setEnabled(false);
				}
				{
					tasaInt = new JTextField();
					jPanel3.add(tasaInt);
					tasaInt.setBounds(500, 114, 118, 25);
					tasaInt.setEditable(false);
					tasaInt.setEnabled(false);
				}
				{
					valorCuota = new JTextField();
					jPanel3.add(valorCuota);
					valorCuota.setBounds(500, 150, 118, 25);
					valorCuota.setEditable(false);
					valorCuota.setEnabled(false);
				}
				{
					error = new JLabel();
					jPanel3.add(error);
					error.setBounds(630, 41, 94, 25);
					error.setVisible(false);
					error.setText("Valor inválido");
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void refresh(int nro) {
		jnombre.setText("Empleado: " + serv.getEmpleado() + ". Legajo: "
				+ serv.getLegajo() + ".");
		ComboBoxModel tipoModel = new DefaultComboBoxModel(serv.getTipoDoc());
		tipodoc.setModel(tipoModel);

		Resultado r;
		if (nro == -1) {
			r = serv.realizarConsulta("SELECT nro_cliente, apellido, nombre, tipo_doc, nro_doc, fecha_nac, direccion, telefono FROM Cliente");
		} else {
			r = serv.realizarConsulta("SELECT nro_cliente, apellido, nombre, tipo_doc, nro_doc, fecha_nac, direccion, telefono FROM Cliente WHERE nro_doc like '"
					+ nro
					+ "%' and tipo_doc like '"
					+ tipodoc.getSelectedItem() + "'");
		}

		if (r.fueExitoso()) {
			ConsultasTableModel modelo = new ConsultasTableModel();

			String[] columnas = r.getColumnas();
			String[] tipo = r.getTipos();
			try {
				for (int i = 0; i < columnas.length; i++) {
					String columnaNombre = columnas[i];
					Class columnaTipo = Class.forName(tipo[i]);
					boolean columnaEditable = false;
					modelo.agregarColumna(columnaNombre, columnaTipo,
							columnaEditable);
				}

				tabla.setModel(modelo);

				Vector<Object[]> filas = r.getFilas();
				for (Object[] f : filas)
					if (f != null)
						((ConsultasTableModel) tabla.getModel()).addRow(f);
			} catch (ClassNotFoundException e) {

			}
		} else {
			JOptionPane.showMessageDialog(
					SwingUtilities.getWindowAncestor(this), r.getExcepcion()
							+ "\n", "Error al ejecutar la consulta.",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	private void verificarCliente(int cliente) {
		this.cliente = cliente;
		Resultado r = serv
				.realizarConsulta("SELECT apellido, nombre, tipo_doc, nro_doc, fecha_nac, direccion, telefono FROM Cliente WHERE nro_cliente ="
						+ cliente);
		if (r.fueExitoso()) {
			Object[] fila = r.getFilas().firstElement();
			infoC.setText("Información del Cliente #" + cliente);
			naC.setText("Apellido, Nombre: " + fila[0] + ", " + fila[1]);
			tnC.setText("Tipo, nro de documento: " + fila[2] + ", " + fila[3]);
			fC.setText("Fecha de nacimiento: " + fila[4]);
			dC.setText("Dirección: " + fila[5]);
			if (fila[6].equals(""))
				tC.setText("Teléfono: No tiene");
			else
				tC.setText("Teléfono: " + fila[6]);
		} else {
			JOptionPane.showMessageDialog(
					SwingUtilities.getWindowAncestor(this), r.getExcepcion()
							+ "\n", "Error al ejecutar la consulta.",
					JOptionPane.ERROR_MESSAGE);
		}

		r = serv.realizarConsulta("SELECT apellido, nombre, tipo_doc, nro_doc, fecha_nac, direccion, telefono FROM Cliente NATURAL JOIN Prestamo WHERE nro_cliente ="
				+ cliente);
		if (r.fueExitoso()) {
			if (r.getFilas().isEmpty()) {
				ppC.setText("Puede solicitar un préstamo: SI");
				ComboBoxModel mesesModel = new DefaultComboBoxModel(
						serv.getMeses());
				meses.setModel(mesesModel);
				valorCuota.setEnabled(true);
				tasaInt.setEnabled(true);
				monto.setEnabled(true);
				meses.setEnabled(true);
			} else {
				ppC.setText("Puede solicitar un préstamo: NO");
				valorCuota.setEnabled(false);
				tasaInt.setEnabled(false);
				monto.setEnabled(false);
				meses.setEnabled(false);
			}
		} else {
			JOptionPane.showMessageDialog(
					SwingUtilities.getWindowAncestor(this), r.getExcepcion()
							+ "\n", "Error al ejecutar la consulta.",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	private void aceptarActionPerformed(ActionEvent evt) {
		try {
			float m = Float.parseFloat(monto.getText());
			int cantM = Integer.parseInt((String) meses.getSelectedItem());
			float tasa = serv.getInteresPrestamo(m, cantM);
			boolean r = serv.crearPrestamo(cantM, m, tasa,
					Float.parseFloat(tasaInt.getText().replace(",", ".")),
					Float.parseFloat(valorCuota.getText().replace(",", ".")),
					serv.getLegajo(), cliente);
			aceptar.setEnabled(false);
			if (r) {
				JOptionPane.showMessageDialog(this,
						"Se ha creado el préstamo con éxito.",
						"Creación Exitosa", JOptionPane.INFORMATION_MESSAGE);
			} else {
				JOptionPane.showMessageDialog(
						SwingUtilities.getWindowAncestor(this),
						"Error al ejecutar la consulta.", "Error",
						JOptionPane.ERROR_MESSAGE);
			}
		} catch (java.lang.Exception e) {
			JOptionPane.showMessageDialog(
					SwingUtilities.getWindowAncestor(this), e.getMessage(),
					"Error", JOptionPane.ERROR_MESSAGE);
		}
	}

	private void calcularValores() {
		float m = Float.parseFloat(monto.getText());
		int cantM = Integer.parseInt((String) meses.getSelectedItem());
		float tasa = serv.getInteresPrestamo(m, cantM);
		float interes = (m * (tasa) * cantM) / 1200;
		tasaInt.setText(String.valueOf(interes).format("%.2f", interes));

		float cuota = (m + interes) / cantM;// BIEN
		valorCuota.setText(String.valueOf(cuota).format("%.2f", cuota));
	}
}